
//
//  LClayout.m
//  UI27_自定义Layout
//
//  Created by Charlie. on 16/1/13.
//  Copyright © 2016年 www.lanou39.蓝鸥科技. All rights reserved.
//

#import "LClayout.h"

@interface LClayout ()
@property (nonatomic, strong) NSMutableDictionary *columYDic; /**< 保存每列的Y值 */

@end
@implementation LClayout

// 控制collcetionView的布局
// 本质就是计算 每一个item的布局信息(x, y, w, h)
// 不规则瀑布流的实现原理:
// 找到当前的最短列 设置item的坐标
#pragma mark - 初始化
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.columYDic = [NSMutableDictionary dictionary];
        self.attributesArr = [NSMutableArray array];
    }
    return self;
}

#pragma mark - 方法1
// 当collectionView布局item时 第一个执行的方法
- (void)prepareLayout
{
    // 重写Layout中的方法 首先必须调用父类
    [super prepareLayout];
    // 初始化每个item的位置
    // 通过y值判断最短列
    // 通过列数 决定Y值字典中 需要的键值对
    for (NSInteger i = 0; i < _columcounts; i++) {
        
        //key
        NSString *key = [NSString stringWithFormat:@"%ld", i];
        //value
        // _columYDic[key] = @(_edgeInsets.top);
        [_columYDic setObject:@(_edgeInsets.top) forKey:key];
        
        
    }

    // 获取collcetionView中item的个数
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
    //遍历得到每个item 设置位置信息
    for (NSInteger i = 0; i < itemCount; i++) {
        //设置位置信息
        [self setItemFrameWithIndex:i];
    }
}

#pragma mark - 方法2单个item位置设置
- (void)setItemFrameWithIndex:(NSInteger)index
{
    // 获取最短列
    // 设置每个item的frame
    
    // 定义临时变量 始终记录最小列下标
    NSString *minColum = @"0";
    // 遍历保存Y值的字典
    for (NSString *y in _columYDic) {
        // 找到最短列
        // [_columYDic[minColum] doubleValue] 从字典中根据最小下标获取的y 值
        // [y doubleValue] 便利到的每一列对应的y值
        if ([_columYDic[minColum] doubleValue] > [_columYDic[y] doubleValue]) {
            // 每次判断的最小列号
            minColum = y;
        }
    }
    // 分别计算frame的值
    // 宽 = (总宽 - 左边距 - 右边距 - (列数 - 1) * 间距) / 列数
    CGFloat w = (self.collectionView.frame.size.width - _edgeInsets.right - _edgeInsets.left - (_columcounts - 1) * _columSpace) / _columcounts;
    // x = 左边距 +(宽 + 列边距)*列数(最小列号 为minColum.doubleVale)
    CGFloat x = _edgeInsets.left +(w + _columSpace) * minColum.doubleValue;
    // 通过item下标 创建位置对象
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:0];
    // 获取高度
    // 通过协议 在VC中求得h 传递在layout中
    CGFloat h = [self.delegate layout:self heightForItemAtindexPath:indexPath width:w];
    
    // 获取y值
    CGFloat y = [_columYDic[minColum] doubleValue];
    // 更新y值
    // 新 y = 旧 y + 高 + 行间距
    [_columYDic setObject:@(y + h + _rowSpace) forKey:minColum];
//    _columYDic[minColum] = @(y + h + _rowSpace);
    
    // 每个item的布局属性 包含frame/bounds/size
    // 根据indexPath获取对应的属性
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    // 添加frame
    attributes.frame = CGRectMake(x, y, w, h);
    // 保存在数组中
    [_attributesArr addObject:attributes];
    
}
#pragma mark - 方法三 布局属性
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{

    return _attributesArr;
}

#pragma mark - 方法四 设置滚动范围
- (CGSize)collectionViewContentSize
{
#pragma mark - 协议
    [self.delegate array:_attributesArr];
    NSString *maxY = @"0";
    // 获取最大y值所在列号
    for (NSString *y in _columYDic) {
        if ([_columYDic[y] doubleValue] > [_columYDic[maxY] doubleValue]) {
            maxY = y;
        }
    }
    // 内容高度
    CGFloat h = [_columYDic[maxY] doubleValue] + _edgeInsets.bottom;
    return CGSizeMake(0, h);
    
}

@end